package com.cans;

import com.cans.api.IUserDao;
import com.cans.impl.UserDao;
import com.cans.impl.UserDaoImpl;
import com.cans.proxy.CglibProxyFactory;
import com.cans.proxy.ProxyFactory;
import com.cans.proxy.UserDaoProxy;
import org.junit.Test;

/**
 * @author: cans
 * @date: 2018/3/4
 * @description:
 */
public class App {

    private static UserDaoImpl userDao = new UserDaoImpl();

    static {
        userDao.setName("小张");
    }

    /**
     * 静态代理
     */
    @Test
    public void staticProxy() {
        // 创建代理类,代理中中包含被代理对象
        UserDaoProxy proxy = new UserDaoProxy(userDao);
        // 通过代理的对象执行方法
        proxy.save();
    }

    /**
     * 使用java动态代理
     * 需要接口
     */
    @Test
    public void javaDynamicProxy() {
        IUserDao proxy = (IUserDao) new ProxyFactory(userDao).getProxyInstance();
        proxy.save();
    }

    /**
     * Cglib 代理
     * 并没有实现接口
     */
    @Test
    public void cglibDynamicProxy() {
        // 代理对象
        UserDaoImpl proxyInstance = (UserDaoImpl) new CglibProxyFactory(userDao).getProxyInstance();
        // 执行方法
        proxyInstance.save();
    }
}
